<?php

namespace app\admin\controller;

use think\Db;
use think\Request;

/**
 * 数据同步管理控制器
 */
class DataSync extends Base
{
    /**
     * 测试接口
     */
    public function test()
    {
        return json([
            'code' => 0,
            'msg' => 'DataSync controller is working',
            'data' => [
                'timestamp' => date('Y-m-d H:i:s'),
                'module' => 'admin',
                'controller' => 'DataSync'
            ]
        ]);
    }
    
    /**
     * 导入症状数据
     */
    public function importSymptoms()
    {
        // 设置执行时间限制为5分钟
        set_time_limit(300);
        
        try {
            // 记录请求日志
            \think\facade\Log::info('DataSync importSymptoms called');
            
            $data = input('post.data', []);
            \think\facade\Log::info('Received data count: ' . count($data));
            
            if (empty($data)) {
                return json(['code' => 1, 'msg' => '数据不能为空']);
            }

            $success = 0;
            $skipped = 0;
            $failed = 0;
            $errors = [];

            // 预先获取所有分类，减少数据库查询
            $categories = Db::name('symptom_categories')
                ->where('is_active', 1)
                ->column('id', 'name_zh_cn');
            
            // 预先获取所有已存在的症状名称
            $existingSymptoms = Db::name('symptoms')
                ->column('name_zh_cn');
            
            // 准备批量插入的数据
            $insertBatch = [];
            $currentTime = date('Y-m-d H:i:s');

            foreach ($data as $item) {
                // 检查分类是否存在
                $categoryId = 0;
                if (!empty($item['category_name'])) {
                    if (!isset($categories[$item['category_name']])) {
                        $failed++;
                        $errors[] = "症状 {$item['name_zh_cn']} 导入失败：分类 {$item['category_name']} 不存在";
                        continue;
                    }
                    $categoryId = $categories[$item['category_name']];
                }
                
                // 检查症状是否已存在
                if (in_array($item['name_zh_cn'], $existingSymptoms)) {
                    $skipped++;
                    continue;
                }

                // 准备插入数据
                $insertBatch[] = [
                    'category_id' => $categoryId,
                    'name_zh_cn' => $item['name_zh_cn'],
                    'name_en_us' => $item['name_en_us'],
                    'name_ja_jp' => $item['name_ja_jp'],
                    'name_be_by' => $item['name_be_by'],
                    'is_active' => 1,
                    'created_at' => $currentTime,
                    'updated_at' => $currentTime
                ];
                
                // 每100条批量插入一次，避免SQL过大
                if (count($insertBatch) >= 100) {
                    try {
                        Db::name('symptoms')->insertAll($insertBatch);
                        $success += count($insertBatch);
                        $insertBatch = [];
                    } catch (\Exception $e) {
                        $failed += count($insertBatch);
                        $errors[] = "批量插入失败：" . $e->getMessage();
                        $insertBatch = [];
                    }
                }
            }
            
            // 插入剩余数据
            if (!empty($insertBatch)) {
                try {
                    Db::name('symptoms')->insertAll($insertBatch);
                    $success += count($insertBatch);
                } catch (\Exception $e) {
                    $failed += count($insertBatch);
                    $errors[] = "批量插入失败：" . $e->getMessage();
                }
            }

            return json([
                'code' => 0,
                'msg' => '导入完成',
                'data' => [
                    'success' => $success,
                    'skipped' => $skipped,
                    'failed' => $failed,
                    'errors' => $errors
                ]
            ]);
        } catch (\Exception $e) {
            return json(['code' => 1, 'msg' => '导入失败：' . $e->getMessage()]);
        }
    }

    /**
     * 导入汤药数据
     */
    public function importFormulas()
    {
        // 设置执行时间限制为5分钟
        set_time_limit(300);
        
        try {
            $data = input('post.data', []);
            
            if (empty($data)) {
                return json(['code' => 1, 'msg' => '数据不能为空']);
            }

            $success = 0;
            $skipped = 0;
            $failed = 0;
            $errors = [];

            // 预先获取所有已存在的方剂名称
            $existingFormulas = Db::name('formulas')
                ->column('name_zh_cn');
            
            // 预先获取所有症状（用于名称转ID）
            $symptoms = Db::name('symptoms')
                ->where('is_active', 1)
                ->column('id', 'name_zh_cn');
            
            // 准备批量插入的数据
            $insertBatch = [];
            $currentTime = date('Y-m-d H:i:s');

            foreach ($data as $item) {
                // 检查是否已存在
                if (in_array($item['name_zh_cn'], $existingFormulas)) {
                    $skipped++;
                    continue;
                }

                // 处理症状ID（如果是文本，需要转换）
                $mainSymptomIds = isset($item['main_symptom_ids']) ? $item['main_symptom_ids'] : '';
                $sideSymptomIds = isset($item['side_symptom_ids']) ? $item['side_symptom_ids'] : '';
                
                // 如果是症状名称字符串，需要转换为ID
                if (!empty($item['main_symptoms']) && empty($mainSymptomIds)) {
                    $mainSymptomIds = $this->convertSymptomNamesToIdsOptimized($item['main_symptoms'], $symptoms);
                }
                if (!empty($item['side_symptoms']) && empty($sideSymptomIds)) {
                    $sideSymptomIds = $this->convertSymptomNamesToIdsOptimized($item['side_symptoms'], $symptoms);
                }

                // 准备插入数据
                $insertBatch[] = [
                    'name_zh_cn' => $item['name_zh_cn'],
                    'name_en_us' => $item['name_en_us'],
                    'name_ja_jp' => $item['name_ja_jp'],
                    'name_be_by' => $item['name_be_by'],
                    'main_symptom_ids' => $mainSymptomIds,
                    'side_symptom_ids' => $sideSymptomIds,
                    'is_active' => 1,
                    'created_at' => $currentTime,
                    'updated_at' => $currentTime
                ];
                
                // 每100条批量插入一次
                if (count($insertBatch) >= 100) {
                    try {
                        Db::name('formulas')->insertAll($insertBatch);
                        $success += count($insertBatch);
                        $insertBatch = [];
                    } catch (\Exception $e) {
                        $failed += count($insertBatch);
                        $errors[] = "批量插入失败：" . $e->getMessage();
                        $insertBatch = [];
                    }
                }
            }
            
            // 插入剩余数据
            if (!empty($insertBatch)) {
                try {
                    Db::name('formulas')->insertAll($insertBatch);
                    $success += count($insertBatch);
                } catch (\Exception $e) {
                    $failed += count($insertBatch);
                    $errors[] = "批量插入失败：" . $e->getMessage();
                }
            }

            return json([
                'code' => 0,
                'msg' => '导入完成',
                'data' => [
                    'success' => $success,
                    'skipped' => $skipped,
                    'failed' => $failed,
                    'errors' => $errors
                ]
            ]);
        } catch (\Exception $e) {
            return json(['code' => 1, 'msg' => '导入失败：' . $e->getMessage()]);
        }
    }
    
    /**
     * 将症状名称字符串转换为症状ID字符串（优化版，传入已查询的症状数据）
     * @param string $symptomNames 症状名称，用分号分隔
     * @param array $symptoms 症状数组 [name => id]
     * @return string 症状ID，用逗号分隔
     */
    private function convertSymptomNamesToIdsOptimized($symptomNames, $symptoms)
    {
        if (empty($symptomNames)) {
            return '';
        }
        
        // 分割症状名称
        $names = array_filter(array_map('trim', explode(';', $symptomNames)));
        $ids = [];
        
        foreach ($names as $name) {
            if (isset($symptoms[$name])) {
                $ids[] = $symptoms[$name];
            }
        }
        
        return implode(',', $ids);
    }
    
    /**
     * 将症状名称字符串转换为症状ID字符串（旧版本，保留兼容性）
     * @param string $symptomNames 症状名称，用分号分隔
     * @return string 症状ID，用逗号分隔
     */
    private function convertSymptomNamesToIds($symptomNames)
    {
        if (empty($symptomNames)) {
            return '';
        }
        
        // 获取所有症状
        $symptoms = Db::name('symptoms')
            ->where('is_active', 1)
            ->column('id', 'name_zh_cn');
        
        return $this->convertSymptomNamesToIdsOptimized($symptomNames, $symptoms);
    }
}
